home *** CD-ROM | disk | FTP | other *** search
/ Aminet 23 / Aminet 23 (1998)(GTI - Schatztruhe)[!][Feb 1998].iso / TurboCalc / Deutsch / Programmer / Examples.lha / object_logo.tclib.s < prev    next >
Text File  |  1994-11-28  |  12KB  |  469 lines

  1. ** Example for a very simple Object-Class.
  2. ** It shows a sizeable picture
  3. **
  4. ** (c) 1994 by Michael Friedrich
  5. ** All Rights Reserved.
  6. **
  7. ** You may use parts of this code to create your own private TCLibs.
  8. ** You are also allowed to publish these TCLibs as long as I will get
  9. ** a copy them.
  10. **
  11.  
  12.     include 'lvos.i'
  13.     include 'tclib.i'
  14.  
  15. startall:
  16.     moveq   #-13,d0     ; if user tries to start this lib!
  17.     rts                 ;   (need -13 to identify TClibs!)
  18.     dc.l 'TCLB'         ; TurboCalc-Lib - this field is used to identify
  19.                         ;   TClibs and to link them in memory (i.e. that
  20.                         ;   this entry is used and thus changed by TC
  21.                         ;   to keep a list of all already loaded libs!)
  22.     dc.l 'OBJT'
  23.     dc.w 1,0            ; Version, Revision
  24.     dc.l txt_name
  25.     dc.l txt_ver
  26.     dc.l txt_author
  27.     dc.l 0              ; flags - reserved
  28.     dc.l 0              ; reserved
  29.     dc.l 0              ; reserved
  30. * default-routines
  31.     dc.l objclass_init  ; init
  32.     dc.l 0  ; exit
  33.     dc.l 0  ; flush
  34.     dc.l 0
  35. *
  36. objclass_pic:
  37.     dc.l 0
  38.     dc.l objclass_picname
  39.     dc.l 'LOGO'
  40.     dc.b 0
  41.     dc.b 1<<OBJCLASSFLAGS1_ACTIONTASK
  42.     dc.b 0,0
  43.     dc.l objpic_new
  44.     dc.l objpic_duplicate
  45.     dc.l objpic_free
  46.     dc.l 0  ; for this example no edit-routine!
  47.     dc.l objpic_draw
  48.     dc.l objpic_load
  49.     dc.l objpic_save
  50.     dc.l objpic_action
  51.  
  52. objclass_picname: dc.b 'Iff-Logo (Example)',0
  53.  
  54. txt_name: dc.b '(Example) Logo-Objectclass',0
  55. txt_ver: dc.b '$VER: Logo-Objectclass V1.0 (20.10.94)',0
  56. txt_author: dc.b '© 1994 Michael Friedrich',0
  57.  cnop 0,2
  58.  
  59.  
  60.  
  61.  
  62.  STRUCTURE ObjPic,0
  63.  
  64.  WORD objpic_depth
  65.  WORD objpic_width
  66.  WORD objpic_height
  67.  LABEL objpic_bitmap
  68. * complete bitmap-structure
  69.     WORD    objpicbm_BytesPerRow
  70.     WORD    objpicbm_Rows
  71.     BYTE    objpicbm_Flags
  72.     BYTE    objpicbm_Depth
  73.     WORD    objpicbm_Pad
  74.     STRUCT  objpicbm_Planes,8*4
  75. *
  76.  LABEL ObjPic_SIZE
  77.  
  78.  STRUCTURE ObjPic_drawmem,0
  79.  LABEL objpicdm_scalearg
  80.     WORD   bsa_SrcX            ; source origin
  81.     WORD   bsa_SrcY
  82.     WORD   bsa_SrcWidth        ; source size
  83.     WORD   bsa_SrcHeight
  84.     WORD   bsa_XSrcFactor      ; scale factor denominators
  85.     WORD   bsa_YSrcFactor
  86.     WORD   bsa_DestX           ; destination origin
  87.     WORD   bsa_DestY
  88.     WORD   bsa_DestWidth       ; destination size result
  89.     WORD   bsa_DestHeight
  90.     WORD   bsa_XDestFactor     ; scale factor numerators
  91.     WORD   bsa_YDestFactor
  92.     LONG    bsa_SrcBitMap       ; source BitMap
  93.     LONG    bsa_DestBitMap      ; destination BitMap
  94.     LONG   bsa_Flags           ; reserved.  Must be zero!
  95.     WORD   bsa_XDDA            ; reserved
  96.     WORD   bsa_YDDA
  97.     LONG    bsa_Reserved1
  98.     LONG    bsa_Reserved2
  99.  WORD objpicdm_tempwidth
  100.  WORD objpicdm_tempheight
  101.  LABEL objpicdm_bitmap2
  102.     WORD    objpicbm2_BytesPerRow
  103.     WORD    objpicbm2_Rows
  104.     BYTE    objpicbm2_Flags
  105.     BYTE    objpicbm2_Depth
  106.     WORD    objpicbm2_Pad
  107.     STRUCT  objpicbm2_Planes,8*4
  108.  LABEL ObjPic_drawmem_SIZE
  109.  
  110.  
  111. objclass_init:
  112. * nothing to init, simply check if we are running with V36+
  113.     GETGFX
  114.     cmp.w   #36,$14(a6)
  115.     bhs.s   10$
  116.     moveq   #-1,d0
  117.     rts
  118. 10$ moveq   #0,d0
  119.     rts
  120.  
  121.  
  122. **********************************
  123.  
  124. objpic_new:
  125.     movem.l d2-d7/a2-a3,-(sp)
  126.     moveq   #ObjPic_SIZE,d0
  127.     XSR     AllocMemClear
  128.     beq.s   90$
  129.     move.l  a0,a3
  130. *
  131.     moveq   #2,d0   ; depth
  132.     moveq   #$4b,d1 ; width
  133.     moveq   #$20,d2 ; height
  134.     movem.w d0-d2,objpic_depth(a3)
  135. *
  136.     lea     objpic_bitmap(a3),a0
  137.     GETGFX
  138.     CALL    _LVOInitBitMap
  139. *
  140.     lea     objpicbm_Planes(a3),a2
  141.     move.l  #AppIcon_p,(a2)+
  142.     move.l  #AppIcon_p+($50/8)*$20,(a2)
  143. *
  144.     move.l  a3,d0
  145.     moveq   #0,d1   ; no _EDIT needed!
  146. 90$ movem.l (sp)+,d2-d7/a2-a3
  147.     rts
  148.  
  149. objpic_duplicate
  150.     move.l  a0,-(sp)
  151.     moveq   #ObjPic_SIZE,d0
  152.     XSR     AllocMemClear
  153.     beq.s   90$
  154.     move.l  (sp),a1
  155.     move.l  a0,(sp)
  156.     moveq   #ObjPic_SIZE/2-1,d0
  157. 21$ move.w  (a1)+,(a0)+
  158.     dbra    d0,21$
  159.     move.l  (sp),a0
  160.     move.l  a0,d0
  161. 90$ addq.w  #4,sp
  162.     rts
  163. objpic_free
  164.     XMP     FreeMem
  165.  
  166. objpic_draw
  167.     movem.l d0-d7,-(sp)
  168.     sub.l   d0,d2
  169.     sub.l   d1,d3
  170.     addq.l  #1,d2
  171.     addq.l  #1,d3
  172.     moveq   #0,d6
  173.     cmp.w   #1000,d2    ; BlitScale fails, if with >1008
  174.     blo.s   40$         ; so divide if it should be bigger
  175.     move.l  d2,-(sp)
  176.     divu    #1000,d2
  177.     addq.w  #1,d2 ; divide in d2 pieces!!!
  178.     move.w  d2,d6
  179.     swap    d6
  180.     move.l  (sp)+,d2
  181. 40$ moveq   #0,d7
  182.     cmp.w   #1000,d3    ; for height this seems to work, but
  183.     blo.s   50$         ; do it never the less for height, too.
  184.     move.l  d3,-(sp)    ; first to be sure and second
  185.     divu    #1000,d3    ; and second to limit temp-bitmap!!!)
  186.     addq.w  #1,d3 ; divide in d3 pieces!!!
  187.     move.w  d3,d7
  188.     swap    d7
  189.     move.l  (sp)+,d3
  190. *** loop for all parts
  191. 50$ movem.l d0-d5/a0-a1,-(sp)
  192. * d6/d7-1):
  193.     move.l  d6,d4
  194.     swap    d4
  195.     tst.w   d4
  196.     beq.s   51$
  197.     divu    d4,d2
  198.     move.l  d2,d5
  199.     mulu    d6,d2
  200.     add.l   d2,d0   ; add width/n * k
  201.     moveq   #0,d2
  202.     move.w  d5,d2
  203.     subq.w  #1,d4
  204.     cmp.w   d4,d6
  205.     bne.s   51$
  206.     swap    d5
  207.     add.w   d5,d2   ; is last part, so add modula
  208. 51$ move.l  d7,d4
  209.     swap    d4
  210.     tst.w   d4
  211.     beq.s   52$
  212.     divu    d4,d3
  213.     move.l  d3,d5
  214.     mulu    d7,d3
  215.     add.l   d3,d1   ; add height/n * k
  216.     moveq   #0,d3
  217.     move.w  d5,d3
  218.     subq.w  #1,d4
  219.     cmp.w   d4,d7
  220.     bne.s   52$
  221.     swap    d5
  222.     add.w   d5,d3   ; is last part, so add modula
  223. 52$ movem.l 4*4(sp),d4/d5
  224. *
  225.     bsr.s   objpic_draw2
  226.     movem.l (sp)+,d0-d5/a0-a1
  227.     addq.w  #1,d6
  228.     move.l  d6,d5
  229.     swap    d5
  230.     cmp.w   d5,d6
  231.     blo.s   50$
  232. *
  233.     clr.w   d6
  234.     addq.w  #1,d7
  235.     move.l  d7,d5
  236.     swap    d5
  237.     cmp.w   d5,d7
  238.     blo.s   50$
  239.     movem.l (sp)+,d0-d7
  240.     rts
  241. * d0-d3: x/y/w/h, d6/d7: upper-word: #pieces, lower-word: piece-number (w/h)
  242. objpic_draw2:
  243.     movem.l d0-d7/a2-a4,-(sp)
  244.     move.l  a0,a3
  245.  
  246. *** alloc second bitmap and blitscale-structure
  247.     moveq   #ObjPic_drawmem_SIZE,d0
  248.     XSR     AllocMemClear
  249.     beq     90$
  250.     move.l  a0,a4
  251. *** fill blitscale-structure!
  252.     lea     objpicdm_scalearg(a4),a1
  253.     clr.l   (a1)+   ; source_x/y
  254.     movem.w objpic_width(a3),d0-d1
  255. * d6/d7-2):
  256.     movem.l d4/d5,-(sp)
  257.     move.l  d6,d4
  258.     swap    d4
  259.     tst.w   d4
  260.     beq.s   21$
  261.     divu    d4,d0
  262.     move.l  d0,d5
  263.     mulu    d6,d0
  264.     move.w  d0,-4(a1)   ; new x-pos: width/n * k
  265.     move.w  d5,d0
  266.     subq.w  #1,d4
  267.     cmp.w   d4,d6
  268.     bne.s   21$
  269.     swap    d5
  270.     add.w   d5,d0       ; is last part, so add modula
  271. 21$ move.l  d7,d4
  272.     swap    d4
  273.     tst.w   d4
  274.     beq.s   22$
  275.     divu    d4,d1
  276.     move.l  d1,d5
  277.     mulu    d7,d1
  278.     move.w  d1,-2(a1)   ; new y-pos: height/n * k
  279.     move.w  d5,d1
  280.     subq.w  #1,d4
  281.     cmp.w   d4,d6
  282.     bne.s   22$
  283.     swap    d5
  284.     add.w   d5,d1       ; is last part, so add modula
  285. 22$ movem.l (sp)+,d4/d5
  286. *
  287.     move.w  d0,(a1)+    ; source_width/height
  288.     move.w  d1,(a1)+
  289.     move.w  d0,(a1)+    ; source_factor
  290.     move.w  d1,(a1)+
  291.     clr.l   (a1)+       ; dest_x/y (are 0 for temp-bitmap!!!)
  292.     clr.l   (a1)+       ; dest_w/h, is calculated by routine!
  293.     move.w  d2,(a1)+    ; dest_factor
  294.     move.w  d3,(a1)+    ; "
  295. *
  296.     lea     objpic_bitmap(a3),a0
  297.     move.l  a0,(a1)+    ; source-bitmap
  298.     lea     objpicdm_bitmap2(a4),a0
  299.     move.l  a0,(a1)+    ; mid-bitmap
  300.     clr.l   (a1)+   ; flags
  301. *** init temp-bitmap!!!
  302. * calc width
  303.     lea     objpicdm_scalearg(a4),a0
  304.     move.w  bsa_SrcWidth(a0),d0
  305.     move.w  bsa_XDestFactor(a0),d1
  306.     move.w  bsa_XSrcFactor(a0),d2
  307.     CALL    -684    ; LVOScalerDiv
  308. *
  309.     move.l  d0,-(sp)
  310.     lea     objpicdm_scalearg(a4),a0
  311.     move.w  bsa_SrcHeight(a0),d0
  312.     move.w  bsa_YDestFactor(a0),d1
  313.     move.w  bsa_YSrcFactor(a0),d2
  314.     CALL    -684    ; LVOScalerDiv
  315.     move.l  d0,d2
  316.     move.l  (sp)+,d1
  317.     move.w  objpic_depth(a3),d0
  318. * compare to dest-values and use higher ones!
  319.     cmp.w   2+2*4(sp),d1
  320.     bls.s   31$
  321.     move.w  2+2*4(sp),d1
  322. 31$ cmp.w   2+3*4(sp),d2
  323.     bls.s   32$
  324.     move.w  2+3*4(sp),d2
  325. 32$ movem.w d1/d2,objpicdm_tempwidth(a4)
  326.     lea     objpicdm_bitmap2(a4),a0
  327.     movem.l d0-d2/a0,-(sp)
  328.     CALL    _LVOInitBitMap
  329. * alloc mem for temp-bitmap
  330.     movem.l (sp)+,d0-d2/a0
  331.     exg.l   d0,d1
  332.     exg.l   d1,d2
  333.     lea     8(a0),a0
  334. 35$ movem.l d0-d2/a0,-(sp)  ; x/y/w
  335.     CALL    _LVOAllocRaster
  336.     move.l  d0,d3
  337.     movem.l (sp)+,d0-d2/a0
  338.     move.l  d3,(a0)+
  339. * well, no error checking here (but as this is only a test-objectclass
  340. * i was too lazy :)
  341.     subq.w  #1,d2
  342.     bne.s   35$
  343. *** blit & scale from first bitmap to temp-bitmap
  344.     lea     objpicdm_scalearg(a4),a0
  345.     CALL    -678    ; _LVOBitMapScale
  346. *** blit temp to rastport
  347.     lea     objpicdm_bitmap2(a4),a0
  348.     move.l  a2,a1
  349.     moveq   #0,d0   ; temp-x/y
  350.     moveq   #0,d1
  351.     movem.l (sp),d2-d5  ; dest-x/y/w/h
  352.     move.w  #$c0,d6     ; copy!
  353.     CALL    _LVOBltBitMapRastPort
  354. *** free allocated structure(s) and end
  355. * free raster
  356. 50$ moveq   #0,d2
  357.     move.b  objpicbm2_Depth(a4),d2
  358.     lea     objpicbm2_Planes(a4),a3
  359. 51$ move.l  (a3)+,a0
  360.     movem.w objpicdm_tempwidth(a4),d0-d1
  361.     CALL    _LVOFreeRaster
  362.     subq.w  #1,d2
  363.     bne.s   51$
  364. ** free temp-structure
  365.     move.l  a4,a0
  366.     XSR     FreeMem
  367. 90$ movem.l (sp)+,d0-d7/a2-a4
  368.     rts
  369.  
  370.  
  371. objpic_load
  372.     tst.l   d0
  373.     bne.s   10$
  374. * d0=0: ask for 6 bytes to load!
  375.     moveq   #6,d0
  376.     suba.l  a0,a0
  377.     rts
  378. * d0=1, a0=*mem for the requested 6 bytes - there aren't used here!
  379. 10$ bsr     objpic_new
  380.     move.l  d0,a0
  381.     moveq   #0,d0   ; free the allocated mem!
  382.     rts
  383.  
  384. objpic_save:
  385. * normally you needn't save any data for this test-objectclass
  386. * to show saving, depth, width and height of the picture are written
  387. * a0 is set, needn't change
  388.     moveq   #6,d0   , write first 6 bytes of a0
  389.     moveq   #0,d1   ; do not free this mem
  390.     rts
  391.  
  392. objpic_action:
  393. * no action, simply return...
  394.     moveq   #0,d0
  395.     rts
  396.  
  397.  
  398.  
  399.  SECTION Graphic,DATA_C
  400.  
  401. AppIcon_p:
  402.  dc.w $7fff,$ffff,$ffff,$ffff,$ffc0
  403.  dc.w $4040,$1002,$0040,$0801,$0040
  404.  dc.w $7fff,$ffff,$ffff,$ffff,$ffc0
  405.  dc.w $4040,$0000,$0000,$0000,$0040
  406.  dc.w $404b,$81c0,$36b5,$c000,$0040
  407.  dc.w $404a,$01c0,$3e80,$0000,$0040
  408.  dc.w $6a80,$0000,$0000,$0000,$0040
  409.  dc.w $4040,$0000,$0000,$0000,$0040
  410.  dc.w $4042,$8000,$7e00,$001c,$0040
  411.  dc.w $4042,$8000,$7e00,$0014,$0040
  412.  dc.w $5540,$0000,$0000,$0000,$0040
  413.  dc.w $4040,$0000,$0000,$0000,$0040
  414.  dc.w $4049,$0180,$3808,$8000,$0040
  415.  dc.w $4049,$0180,$3808,$0000,$0040
  416.  dc.w $6ac0,$0000,$0000,$0000,$0040
  417.  dc.w $4046,$0000,$0000,$0000,$0040
  418.  dc.w $4046,$0700,$001f,$ffff,$ffc0
  419.  dc.w $4040,$0000,$001f,$ffff,$ffc0
  420.  dc.w $5540,$0000,$0010,$0000,$0040
  421.  dc.w $4040,$0000,$0011,$3800,$1c40
  422.  dc.w $4040,$07a0,$1e11,$3800,$1c40
  423.  dc.w $4040,$05e0,$0f11,$381c,$1c40
  424.  dc.w $6ac0,$0000,$0011,$3f1c,$1c40
  425.  dc.w $4040,$0000,$0011,$3f1c,$1c40
  426.  dc.w $4042,$8000,$0013,$ffff,$ff40
  427.  dc.w $4042,$8000,$0011,$0003,$8040
  428.  dc.w $6ae0,$0000,$0011,$0003,$8040
  429.  dc.w $4040,$0000,$0011,$0003,$8040
  430.  dc.w $4040,$0000,$0010,$0000,$0040
  431.  dc.w $7fff,$ffff,$ffff,$ffff,$ffc0
  432.  dc.w $0000,$0000,$0000,$0000,$0000
  433.  dc.w $0000,$0000,$0000,$0000,$0000
  434.  dc.w $0000,$0000,$0000,$0000,$0000
  435.  dc.w $0007,$00e0,$1c03,$8070,$1c00
  436.  dc.w $0000,$0000,$0000,$0000,$0000
  437.  dc.w $003f,$effd,$ffbf,$f7fe,$ff80
  438.  dc.w $0e34,$7fff,$c94a,$3fff,$ff80
  439.  dc.w $0031,$effd,$c13f,$f7fe,$ff80
  440.  dc.w $0015,$5555,$5555,$5555,$5500
  441.  dc.w $003f,$effd,$ffbf,$f7fe,$ff80
  442.  dc.w $0e3d,$7fff,$ffff,$ffe3,$ff80
  443.  dc.w $003d,$6ffd,$ffbf,$f7ea,$ff80
  444.  dc.w $0015,$5555,$5555,$5555,$5500
  445.  dc.w $003f,$effd,$ffbf,$f7fe,$ff80
  446.  dc.w $0e36,$fe7f,$c7f7,$7fff,$ff80
  447.  dc.w $0036,$ee7d,$c7b7,$f7fe,$ff80
  448.  dc.w $0015,$5555,$5555,$5555,$5500
  449.  dc.w $0039,$effd,$ffbf,$f7fe,$ff80
  450.  dc.w $0e39,$f8ff,$ffe0,$0000,$0000
  451.  dc.w $003f,$effd,$ffaf,$ffff,$ff80
  452.  dc.w $0005,$5555,$554f,$ffff,$ff80
  453.  dc.w $003f,$effd,$ffae,$ffff,$ff80
  454.  dc.w $0e3f,$f85f,$ffee,$ffff,$ff80
  455.  dc.w $003f,$ea1d,$f0ae,$ffff,$ff80
  456.  dc.w $0015,$5555,$554e,$f8ff,$ff80
  457.  dc.w $003f,$effd,$ffae,$f8ff,$ff80
  458.  dc.w $0e3d,$7fff,$ffec,$0000,$0080
  459.  dc.w $003d,$6ffd,$ffae,$fffc,$7f80
  460.  dc.w $0015,$5555,$554e,$fffc,$7f80
  461.  dc.w $003f,$effd,$ffae,$fffc,$7f80
  462.  dc.w $0e3f,$ffff,$ffef,$ffff,$ff80
  463.  dc.w $0000,$0000,$0000,$0000,$0000
  464.  dc.w $0000,$0000,$0000,$0000,$0000
  465.  dc.w $0000,$0000,$0000,$0000,$0000
  466.  
  467.  END
  468.  
  469.